module Mfxu_booth2_pp_gen( pp_out, pp_s, pp_e, mcand, booth2);
   parameter WIDTH = 17;

   output logic [WIDTH-1:0] pp_out;
   output logic 			pp_s, pp_e;

   input logic [WIDTH-1:0] 	mcand;
   input logic [2:0] 		booth2;

   always_comb
	 begin
		// unique case(booth2)
		case(booth2)
		  3'b000, 3'b111:		// 0
			begin
			   pp_out = '0;
			   pp_s = 1'b0;
			   pp_e = 1'b1;		// E[i] is the inv of sign of PP[i]
			end
		  3'b001, 3'b010:		// +A
			begin
			   pp_out = mcand[WIDTH-1:0];
			   pp_s = 1'b0;
			   pp_e = mcand[WIDTH-1] ? 1'b0 : 1'b1;
			end
		  3'b011:				// +2A
			begin
			   pp_out = {mcand[WIDTH-2:0], 1'b0};
			   pp_s = 1'b0;
			   pp_e = mcand[WIDTH-1] ? 1'b0 : 1'b1;
			end
		  3'b100:				// -2A
			begin
			   pp_out = {~mcand[WIDTH-2:0], 1'b1};
			   pp_s = 1'b1;
			   pp_e = mcand[WIDTH-1] ? 1'b1 : 1'b0;
			end
		  3'b101, 3'b110:		// -A
			begin
			   pp_out = ~mcand[WIDTH-1:0];
			   pp_s = 1'b1;
			   pp_e = mcand[WIDTH-1] ? 1'b1 : 1'b0;
			end
		endcase // unique case (booth2)
	 end // always_comb
endmodule // Mfxu_booth2_pp_gen

// module Mfxu_booth2_pp_gen_stage1( /*AUTOARG*/
//    // Outputs
//    o_booth2_zero, o_booth2_neg, o_booth2_shift,
//    // Inputs
//    i_bincode
//    );
//    output logic 				o_booth2_zero, o_booth2_neg, o_booth2_shift;
//    input logic 					i_bincode;

   
//    always_comb
// 	 begin
// 		if(i_bincode == 3'b000 || i_bincode == 3'b111) // 0
// 		  booth2_zero = 1'b1;
// 		else
// 		  booth2_zero = 1'b0;
		
// 		if(i_bincode == 3'b100 || i_bincde == 3'b101 || i_bincode == 3'b110) // -A or -2A
// 		  booth2_neg = 1'b1;
// 		else
// 		  booth2_neg = 1'b0;
		
// 		if(i_bincode == 3'b011 || i_bincode == 3'b100) //+-2A
// 		  booth2_shift = 1'b1;
// 		else
// 		  booth2_shift = 1'b0;
// 	 end // always_comb
// endmodule // Mfxu_booth2_pp_gen_stage1


   
   

// module Mfxu_booth2_pp_gen_stage2( /*AUTOARG*/
//    // Outputs
//    o_pp, o_pp_s, o_pp_e,
//    // Inputs
//    i_booth2_zero, i_booth2_neg, i_booth2_shift, i_mcand
//    );
//    parameter WIDTH = 17;
   
//    output logic [WIDTH-1:0] o_pp;
//    output logic 			o_pp_s, o_pp_e;
//    input logic 				i_booth2_zero, i_booth2_neg, i_booth2_shift;
//    input logic [WIDTH-1:0] i_mcand;

//    logic 				   mcand_sign;
//    assign mcand_sign = i_mcand[WIDTH-1];
   
//    logic [WIDTH-1:0] 	   pp_out_s0, pp_out_s1, pp_out_s2;
//    assign pp_out_s0 = booth2_shift ? {mcand[WIDTH-2:0], 1'b0} : mcand;
//    assign pp_out_s1 = booth2_neg ? ~pp_out_s0 : pp_out_s0;
//    assign pp_out_s2 = booth2_zero ? '0 : pp_out_s1;

//    assign o_pp = pp_out_s2;
   
//    assign o_pp_s = i_booth2_neg;
//    assign o_pp_e = i_booth2_zero | (i_booth2_neg ~^ mcand_sign);
// endmodule // Mfxu_booth2_pp_gen_stage2


